home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
GameKit
/
Examples
/
PacMan
/
PacManPreferencesBrain.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
5KB
|
125 lines
#import "PacManPreferencesBrain.h"
#import "PacManView.h" // Need to send it the new -setScale: method
#import <stdio.h>
#import <string.h>
// Size of the play window when the game comes up if no default is set.
#define DEFAULTscale 1 // default is a 1 or 2
// The screen must be at least this size to use the "Big" option.
// Technically, the big window _does_ fit on 800x600, but you have to
// play with the window positioning, and it looks kind of ugly when
// you're done. Thus I require the 1024x768 or larger settings.
// If you've got an 800x600 screen and _really_ want this option,
// then change these numbers...but it's probably not worth it.
#define MINWIDTHFORBIG 900.0
#define MINHEIGHTFORBIG 650.0
static BOOL screenTooSmall(id gameScreen)
{ // return YES if screen is too small for big size option, NO otherwise
const NXScreen *theScreen;
theScreen = [[gameScreen window] screen]; // screen with game window
if (!theScreen) theScreen = [NXApp mainScreen]; // if window not on screen
if ((NX_WIDTH(&(theScreen->screenBounds)) < MINWIDTHFORBIG) ||
(NX_HEIGHT(&(theScreen->screenBounds)) < MINHEIGHTFORBIG)) return YES;
return NO;
}
@implementation PacManPreferencesBrain
// Methods for the Preference we add (the screen size "scale", int: 1 or 2)
// -(int)scale to query, - setScale:(int)newScale to set programmatically,
// and - scaleChange:sender to change from the panel's controls.
- (int)scale { return scale; }
- setScale:(int)newScale
{ // keep the value in the accepted range
// you should follow up any call to this method with a call to the
// gamescreen's -setScale: method -- I don't call it from here!
if (screenTooSmall(gameScreen)) newScale = 1;
if ((newScale < 1) || (newScale > 2)) return self;
scale = newScale;
return self;
}
- scaleChange:sender
{ // sender must be a Matrix of radio buttons with the tags 1=small, 2=big
scale = [[sender selectedCell] tag];
if (screenTooSmall(gameScreen)) scale = 1;
[gameScreen setScale:scale];
return self;
}
- readDefaults:sender // get preferences from defaults database
{ // This shows how to add other prefs values beyond what the GameKit
// normally provides *and* how to override GameKit restrictions on
// the size of these variables (speed in this case; GameKit restricts
// it to the range 0-2, but I want 0-3 for PacMan.)
int speedTemp = getIntPreference("GameSpeed", 0, 3, 1); // load w/my MAX
scale = getIntPreference("Scale", 1, 2, DEFAULTscale); // a new pref
if (screenTooSmall(gameScreen)) scale = 1; // keep with screen size.
[super readDefaults:sender]; // get the GameKit versions
speed = speedTemp; // override the GameKit restrictions
return self;
}
- writeDefaults:sender // save preferences in defaults database
{
[super writeDefaults:sender];
// don't need to override speed here, just add the new pref.
putIntPreference("Scale", scale);
return self;
}
- revert:sender // return to default values
{
[super revert:sender];
scale = DEFAULTscale; // this is the default value of the scale
return [self preferences:self]; // update the panel
}
- refresh
{
[super refresh]; // puts current prefs values into the panel
// disable big/small if screen too small and turn on the right radio switch
[scaleMatrix setEnabled:!screenTooSmall(gameScreen)];
[scaleMatrix selectCellWithTag:scale];
return self;
}
// The next three methods are added to load specific pictures into the
// background... the pix must be in the app wrapper. The methods all
// just ask the GameView to load the background image and then display it.
- back1:sender { return [gameScreen loadAnImage:"Gradation.eps"]; }
- back2:sender { return [gameScreen loadAnImage:"lush.tiff"]; }
- back3:sender { return [gameScreen loadAnImage:"Sunset.tiff"]; }
// This one sets the background to a solid black. It's here by
// user request, even though it is functionally redundant. That's
// why I put in the alert panel. If people get used to dragging colors
// into game windows -- and it always works in the gamekit -- then I
// won't have to stick this into every game I make; instead they'll
// try the drag/drop first, rather than looking for a menu buried on
// the prefs panel. :-)
- solidBlack:sender
{ // The user can get this by dragging a color chip into the
// game window, but this isn't completely obvious, so we
// provide this. We'll pop up an alert the first time around
// to let them know about drag and drop...
NXPoint tempPoint = { 0.0, 0.0 }; // for temp use...
if (alert && !getBOOLPreference("KnowDrag", NO)) {
NXRunAlertPanel(
[strings valueForStringKey:"DidjaKnow"],
[strings valueForStringKey:"YouCanDrag"],
[strings valueForStringKey:"Neato"], NULL, NULL);
putBOOLPreference("KnowDrag", YES);
}
// now, simulate drag of a black chip into the gameview:
[gameScreen acceptColor:NX_COLORBLACK atPoint:&tempPoint];
return self;
}
@end